/*
 *  Copyright (C) 2010 glauco
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.common;

import org.balisunrise.common.listeners.FieldInputListener;

/**
 * Interface que representa os componentes de visualização e entrada dos valores
 * dos campos das entidades.
 * 
 * @author Glauco
 */
public interface FieldInput<V> extends FieldComponent<V> {

    /**
     * Retorna o ComponentManager para representação visual deste campo de 
     * entidade.
     */
    public ComponentManager<?,V> getComponentManager();

    /**
     * Retorna o valor exibido pela representação visual.
     * O dado retornado é do tipo utilizado pela representação visual.
     * Exemplo: Se o campo de uma entidade for do tipo Integer e o a
     * representação visual for um campo de texto, o tipo de dado retornado será
     * um texto (String) e não um Integer.
     */
    public Object getValue();

    /**
     * Atribui o valor exibido pela representação visual.
     * O dado deve ser do tipo utilizado pela representação visual.
     * Exemplo: Se o campo de uma entidade for do tipo Integer e o a
     * representação visual for um campo de texto, o tipo de dado deverá ser um
     * texto (String) e não um Integer.
     */
    public void setValue(Object value);

    /**
     * Adiciona um Listener.
     */
    public void addFieldInputListener(FieldInputListener fieldInputListener);

    /**
     * Retorna os FieldInputListener deste FieldInput.
     */
    public FieldInputListener[] getFieldInputListeners();

    /**
     * Remove um FieldInputListener deste FieldInput.
     * Somente removerá se o FieldInputListener fizer parte deste FieldInput.
     * @param fieldInputListener à remover.
     * @return true if the FieldInputListener was removed.
     */
    public boolean removeFieldInputListener(FieldInputListener fieldInputListener);
}
